package com.ljy.jymail.order.service.impl;

import com.ljy.jymail.order.entity.OrderEntity;
import com.ljy.jymail.order.entity.OrderReturnReasonEntity;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;


import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ljy.common.utils.PageUtils;
import com.ljy.common.utils.Query;

import com.ljy.jymail.order.dao.OrderItemDao;
import com.ljy.jymail.order.entity.OrderItemEntity;
import com.ljy.jymail.order.service.OrderItemService;

@RabbitListener(queues = {"hello-java-queue"})
@Service("orderItemService")
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<OrderItemEntity> page = this.page(
                new Query<OrderItemEntity>().getPage(params),
                new QueryWrapper<OrderItemEntity>()
        );

        return new PageUtils(page);
    }

    /*
    * 接收消息方法
    * 消息类型：org.springframework.amqp.core.Message
    *
    *
    * 获取被发送的类型的对象：
    * 1.T<发送消息的类型>直接接收想要的类型对象
    * 2.Message:可以获取消息头，消息体，队列，交换机信息
    * 3.Channel channel:当前传输数据的通道
    *
    * Queue：可以很多人都来监听，只要收到消息，队列就会删除消息，而且只能由一个人收到此消息
    *
    * 场景：
    *   1.订单服务启动多个,同一个消息，只能由一个客户端收到
    *   2.业务处理耗时，只有当前的所有消息处理完时，才会接收下一个消息
    *
    * 消费端确认：
    *   1.默认是自动确认的，只要消息接收到，服务端就会移除这个消息(客户端自动确认机制)
    *       问题：收到一个消息，自动回复给服务器ack，但是只有一个消息处理成功，宕机了，此时就发生了消息丢失
    *            为保证消息不丢失，需要开启手动确认
    *            收货：basicAck()
    *            拒绝：basicNack() 可以设置是否批量拒绝
    * */
    @RabbitHandler
    public void recieveMessageHandler(Message message,
                               OrderReturnReasonEntity content,
                               Channel channel) throws InterruptedException {
//        System.out.println("接收到消息..内容是："+content);

    }

    @RabbitHandler
    public void recieveMessageHandler(OrderEntity content) throws InterruptedException {
//        System.out.println("接收到消息..内容是："+content);

    }

    @RabbitListener
    public void recieveMessage(Message message,
                               OrderReturnReasonEntity content,
                               Channel channel) throws InterruptedException {

        //deliveryTag:自增的序列，相当于接收到的信息的id，可以通过此来进行货物的接收
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {
            if (deliveryTag == 0){
                //channel:通道
                channel.basicAck(deliveryTag,false);
            }else {
                //模拟没有签收货物
            }

        }catch (Exception e){
            //网络中断，通道断开,信息状态noAck
        }
    }


}